// 导入 axios
import axios from 'axios'
import { Message } from 'element-ui' //Message:消息提示
import store from '@/store'
//导入router
import router from '../router'
//导入操作 token 的方法
import { getTokenTime } from './auth'
//定义一个变量:用来设置token 的时间 (30分钟)
const endTime = 30 * 60 * 1000

// create an axios instance
// 创建一个axios 副本
const instance = axios.create({
  // 设置基地址
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  // 设置超时时间
  timeout: 5000 // request timeout
})

// 设置拦截器
// 请求拦截器
// request interceptor
instance.interceptors.request.use(
  //请求成功的回调函数
  config => {
    //获取token
    // const token = getToken() //本地
    const token = store.getters.token //从vuex里获取token
    if (token) {
      //判断 token 是否失效
      //得到 token 创建的时间
      const time = getTokenTime()
      const space = Date.now() - time
      //判断时间间隔是否小于规定的过期时间
      // console.log(space, endTime)
      if (space > endTime) {
        //过期了  退出登录  提示信息
        store.dispatch('user/logout')
        //跳转到登陆页面
        const path = window.location.href.split('#')[1]
        router.push(`/login?_redirect=${path}`)
        Message({
          type: 'error',
          message: 'token 超时 登陆过期了'
        })
        return Promise.reject(new Error('超时'))
      }
      //统一设置请求头中的token
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  //请求失败时的回调函数
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
// response interceptor
instance.interceptors.response.use(
  response => {
    //得到返回的数据
    const { data, message, success } = response.data
    //判断请求
    if (success) {
      //网络请求
      return data
    } else {
      //提示错误
      Message({
        message: message,
        type: 'error'
      })
      //网络请求出错
      return Promise.reject(new Error(message))
    }
  },
  error => {
    console.dir(error)
    //接收错误信息
    //判断当前错误是否为token失效
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      //说明 token 超时
      //提示用户token token 失效
      Message({
        type: 'error',
        message: '登录超时,请重新登录'
      })
      //删除token
      store.dispatch('user/logout') //删除 token & 删除 userInfo
      //保存当前页面的路径
      const path = window.location.href.split('#')[1]
      //跳转回登录页
      router.push(`/login?_redirect=${path}`)
    } else {
      message.error(error.message) //如果不是token失效,打印这个
    }
    return Promise.reject(error)
  }
)

export default instance
